{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# সিফ্ট কেরাস এর সাথে ব্যক্তিগত ভবিষ্যদ্বাণী  (Private Predictions with Syft Keras)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# পর্ব  1: পাবলিক প্রশিক্ষণ (Public Training)\n",
    "\n",
    "এই টিউটোরিয়ালে স্বাগতম! নিম্নলিখিত নোটবুকগুলিতে আপনি কীভাবে ব্যক্তিগত পূর্বাভাস সরবরাহ করবেন তা শিখবেন। ব্যক্তিগত ভবিষ্যদ্বাণী অনুসারে, আমরা বোঝাতে চাইছি যে পুরো প্রক্রিয়া জুড়ে ডেটা অবিচ্ছিন্নভাবে এনক্রিপ্ট করা থাকে। কোনও পর্যায়ে ব্যবহারকারী কাঁচা ডেটা ভাগ করে না, কেবল এনক্রিপ্ট করে (এটি গোপন ভাগ করে নেওয়া হয়)। এই ব্যক্তিগত ভবিষ্যদ্বাণী সরবরাহ করার জন্য, সিফ্ট কেরাস নামক একটি লাইব্রেরি ব্যবহার করে [TF Encrypted](https://github.com/tf-encrypted/tf-encrypted) অধীনে টিএফ এনক্রিপটেডটি কাটিং-এজ-ক্রিপ্টোগ্রাফিক এবং মেশিন লার্নিংয়ের কৌশলগুলিকে একত্রিত করে, তবে আপনাকে এটি নিয়ে চিন্তা করতে হবে না এবং আপনার মেশিন লার্নিং অ্যাপ্লিকেশনটিতে ফোকাস করতে পারেন।\n",
    "\n",
    "আপনি কেবলমাত্র তিনটি পদক্ষেপের সাহায্যে ব্যক্তিগত ভবিষ্যদ্বাণী দেওয়া শুরু করতে পারেন:\n",
    "- **পর্ব  1**: আপনার মডেলটিকে সাধারণ কেরাস দিয়ে প্রশিক্ষণ দিন।\n",
    "- **পর্ব  2**: আপনার মেশিন লার্নিং মডেল (সার্ভার) সুরক্ষিত এবং পরিবেশন করুন।\n",
    "- **পর্ব  3**: ব্যক্তিগত ভবিষ্যদ্বানী (ক্লায়েন্ট) পেতে সুরক্ষিত মডেলটি জিজ্ঞাসা করুন।\n",
    "\n",
    "ঠিক আছে, আসুন এই তিনটি পদক্ষেপটি অতিক্রম করুন যাতে আপনি ব্যবহারকারীর গোপনীয়তা বা মডেল সুরক্ষা ত্যাগ না করে কার্যকর মেশিন লার্নিং পরিষেবা স্থাপন করতে পারেন।\n",
    "\n",
    "লেখক:\n",
    "- Jason Mancuso - Twitter: [@jvmancuso](https://twitter.com/jvmancuso)\n",
    "- Yann Dupis - Twitter: [@YannDupis](https://twitter.com/YannDupis)\n",
    "- Morten Dahl - Twitter: [@mortendahlcs](https://github.com/mortendahlcs)\n",
    "\n",
    "সমর্থনে:\n",
    "- Dropout Labs - Twitter: [@dropoutlabs](https://twitter.com/dropoutlabs)\n",
    "- TF Encrypted - Twitter: [@tf_encrypted](https://twitter.com/tf_encrypted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "অনুবাদক:\n",
    "\n",
    "- Sourav Das - Twitter: [@adventuroussrv](https://twitter.com/adventuroussrv)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## কেরাসের সাথে আপনার মডেলটিকে প্রশিক্ষণ দিন (Train your model with Keras)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আপনার প্রকল্পগুলির জন্য গোপনীয়তা সংরক্ষণের মেশিন শেখার কৌশলগুলি ব্যবহার করার জন্য আপনাকে একটি নতুন মেশিন লার্নিং ফ্রেমওয়ার্ক শিখতে হবে না। আপনার যদি বেসিক থাকে[Keras](https://keras.io/) জ্ঞান, আপনি সিফ্ট কেরাস দিয়ে এই কৌশলগুলি ব্যবহার শুরু করতে পারেন। যদি আপনি এর আগে কখনও কেরাস ব্যবহার না করে থাকেন তবে আপনি এর মাধ্যমে আপনি আরও কিছুটা জানতে পারেন [Keras documentation](https://keras.io). \n",
    "\n",
    "ব্যক্তিগত ভবিষ্যদ্বাণীগুলি পরিবেশন করার আগে, প্রথম পদক্ষেপটি আপনার মডেলটিকে সাধারণ কেরাস দিয়ে প্রশিক্ষণ দেওয়া। উদাহরণ হিসাবে, আমরা হস্তাক্ষর অঙ্কগুলি শ্রেণীবদ্ধ করার জন্য একটি মডেলকে প্রশিক্ষণ দেব। এই মডেলটি প্রশিক্ষণের জন্য আমরা ক্যানোনিকাল ব্যবহার করব [MNIST dataset](http://yann.lecun.com/exdb/mnist/).\n",
    "\n",
    "আমরা ধার নিলাম [this example](https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py) রেফারেন্স কেরাস সংগ্রহশালা থেকে। আপনার শ্রেণিবদ্ধকরণের মডেলটি প্রশিক্ষণের জন্য, আপনি কেবল নীচের ঘরটি চালাবেন।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "import tensorflow.keras as keras\n",
    "from tensorflow.keras.datasets import mnist\n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.layers import Dense, Dropout, Flatten\n",
    "from tensorflow.keras.layers import Conv2D, AveragePooling2D\n",
    "from tensorflow.keras.layers import Activation\n",
    "\n",
    "batch_size = 128\n",
    "num_classes = 10\n",
    "epochs = 2\n",
    "\n",
    "# input image dimensions\n",
    "img_rows, img_cols = 28, 28\n",
    "\n",
    "# the data, split between train and test sets\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "\n",
    "x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)\n",
    "x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)\n",
    "input_shape = (img_rows, img_cols, 1)\n",
    "\n",
    "x_train = x_train.astype('float32')\n",
    "x_test = x_test.astype('float32')\n",
    "x_train /= 255\n",
    "x_test /= 255\n",
    "print('x_train shape:', x_train.shape)\n",
    "print(x_train.shape[0], 'train samples')\n",
    "print(x_test.shape[0], 'test samples')\n",
    "\n",
    "# convert class vectors to binary class matrices\n",
    "y_train = keras.utils.to_categorical(y_train, num_classes)\n",
    "y_test = keras.utils.to_categorical(y_test, num_classes)\n",
    "\n",
    "model = Sequential()\n",
    "\n",
    "model.add(Conv2D(10, (3, 3), input_shape=input_shape))\n",
    "model.add(AveragePooling2D((2, 2)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(Conv2D(32, (3, 3)))\n",
    "model.add(AveragePooling2D((2, 2)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(Conv2D(64, (3, 3)))\n",
    "model.add(AveragePooling2D((2, 2)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(Flatten())\n",
    "model.add(Dense(num_classes, activation='softmax'))\n",
    "\n",
    "model.compile(loss=keras.losses.categorical_crossentropy,\n",
    "              optimizer=keras.optimizers.Adam(),\n",
    "              metrics=['accuracy'])\n",
    "\n",
    "model.fit(x_train, y_train,\n",
    "          batch_size=batch_size,\n",
    "          epochs=epochs,\n",
    "          verbose=1,\n",
    "          validation_data=(x_test, y_test))\n",
    "score = model.evaluate(x_test, y_test, verbose=0)\n",
    "print('Test loss:', score[0])\n",
    "print('Test accuracy:', score[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ভবিষ্যতের ব্যক্তিগত ভবিষ্যদ্বাণী করার জন্য আপনার মডেলের ওজনগুলি সংরক্ষণ করুন (Save your model's weights for future private prediction)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "চমৎকার আপনার মডেল প্রশিক্ষিত হয়েছে। আসুন মডেল ওজনগুলি দিয়ে সংরক্ষণ করুন`model.save()`. পরবর্তী নোটবুকে, আমরা ব্যক্তিগত পূর্বাভাসগুলি সরবরাহ করা শুরু করতে সিফ্ট কেরাসে এই ওজনগুলি লোড করব।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save('short-conv-mnist.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.17"
  },
  "nbTranslate": {
   "displayLangs": [
    "*"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "fr",
   "useGoogleTranslate": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
